Coverage Report

Created: 2026-02-05 09:02

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
D:\a\scloud-dns\scloud-dns\src\exceptions\mod.rs
Line
Count
Source
1
use strum_macros::EnumIter;
2
3
mod tests;
4
5
#[allow(non_camel_case_types)]
6
#[derive(Debug, PartialEq, EnumIter, Clone)]
7
pub enum SCloudException {
8
    // HEADER SECTION
9
    SCLOUD_HEADER_DESERIALIZATION_FAILED,
10
    SCLOUD_HEADER_BYTES_EMPTY,
11
12
    // QUESTION SECTION
13
    SCLOUD_QUESTION_DESERIALIZATION_FAILED,
14
    SCLOUD_QUESTION_SERIALIZATION_FAILED_QNAME_TOO_LONG,
15
16
    // ANSWER SECTION
17
    SCLOUD_ANSWER_DESERIALIZATION_FAILED,
18
    SCLOUD_ANSWER_DESERIALIZATION_FAILED_LABEL_TOO_LONG,
19
    SCLOUD_IMPOSSIBLE_PARSE_ANSWER_HEADER_TOO_SHORT,
20
    SCLOUD_IMPOSSIBLE_PARSE_ANSWER_RDATA_OUT_OF_BOUNDS,
21
22
    // AUTHORITY SECTION
23
    SCLOUD_AUTHORITY_DESERIALIZATION_FAILED_RDATA_OUT_OF_BOUNDS,
24
    SCLOUD_AUTHORITY_DESERIALIZATION_FAILED_BUF_TOO_SHORT,
25
26
    // ADDITIONAL SECTION
27
    SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED,
28
    SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_BUF_TOO_SHORT,
29
    SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_QNAME_TOO_LONG,
30
    SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_RDATA_OUT_OF_BOUNDS,
31
32
    // QNAME
33
    SCLOUD_IMPOSSIBLE_PARSE_QNAME,
34
    SCLOUD_IMPOSSIBLE_PARSE_QNAME_POS_GREATER_THAN_BUF,
35
    SCLOUD_IMPOSSIBLE_PARSE_QNAME_POS_AND_LEN_GREATER_THAN_BUF,
36
    SCLOUD_IMPOSSIBLE_PARSE_QNAME_COMPRESSION_FAILED,
37
38
    // QTYPE
39
    SCLOUD_QTYPE_UNKNOWN_TYPE,
40
41
    //QCLASS
42
    SCLOUD_QCLASS_U16_FOR_DNSCLASS_UNKNOWN,
43
    SCLOUD_QCLASS_DNSCLASS_FOR_U16_UNKNOWN,
44
45
    // STUB RESOLVER
46
    SCLOUD_STUB_RESOLVER_INVALID_DNS_ID,
47
    SCLOUD_STUB_RESOLVER_INVALID_DNS_RESPONSE,
48
    SCLOUD_STUB_RESOLVER_FAILED_TO_CREATE_SOCKET,
49
    SCLOUD_STUB_RESOLVER_FAILED_TO_READ_SOCKET_TIMEOUT,
50
    SCLOUD_STUB_RESOLVER_FAILED_TO_SEND_TO_SOCKET,
51
    SCLOUD_STUB_RESOLVER_FAILED_TO_RECV_FROM_SOCKET,
52
53
    // RESOLVER
54
    SCLOUD_RESOLVER_ANSWER_MISMATCH,
55
    SCLOUD_RESOLVER_RECORD_OUT_OF_ZONE,
56
57
    // ZONES
58
    SCLOUD_ZONE_PARSER_FILE_NOT_FOUND,
59
    SCLOUD_ZONE_PARSER_FILE_EMPTY,
60
    SCLOUD_ZONE_PARSER_FAILED_TO_READ_ZONE_FILE,
61
    SCLOUD_ZONE_PARSER_FAILED_TO_READ_TTL_FIELD,
62
63
    // CONFIG
64
    SCLOUD_CONFIG_FILE_NOT_FOUND,
65
    SCLOUD_CONFIG_IMPOSSIBLE_TO_PARSE_JSON,
66
    SCLOUD_CONFIG_MISSING_FORWARDER,
67
    SCLOUD_CONFIG_MISSING_ADDRESS,
68
    SCLOUD_CONFIG_IMPOSSIBLE_TO_PARSE_ADDR,
69
    SCLOUD_CONFIG_INVALID_SERVER_PORT,
70
    SCLOUD_CONFIG_INVALID_MAX_UDP_PAYLOAD,
71
    SCLOUD_CONFIG_INVALID_DNS_LIMITS,
72
    SCLOUD_CONFIG_INVALID_LISTENER,
73
    SCLOUD_CONFIG_DUPLICATE_LISTENER_NAME,
74
    SCLOUD_CONFIG_INVALID_LISTENER_PORT,
75
    SCLOUD_CONFIG_INVALID_LISTENER_PROTOCOLS,
76
    SCLOUD_CONFIG_TLS_MISSING_CERT,
77
    SCLOUD_CONFIG_TLS_MISSING_KEY,
78
    SCLOUD_CONFIG_TLS_REQUIRES_TCP,
79
    SCLOUD_CONFIG_INVALID_DOH,
80
    SCLOUD_CONFIG_UNKNOWN_ACL_REFERENCE,
81
    SCLOUD_CONFIG_INVALID_FORWARDER,
82
    SCLOUD_CONFIG_DUPLICATE_FORWARDER_NAME,
83
    SCLOUD_CONFIG_INVALID_ZONE,
84
    SCLOUD_CONFIG_DUPLICATE_ZONE_NAME,
85
    SCLOUD_CONFIG_ZONE_MISSING_FILE,
86
    SCLOUD_CONFIG_SLAVE_MISSING_MASTERS,
87
    SCLOUD_CONFIG_FORWARD_ZONE_MISSING_FORWARDERS,
88
    SCLOUD_CONFIG_INVALID_INLINE_ZONE,
89
    SCLOUD_CONFIG_UNKNOWN_TSIG_KEY,
90
    SCLOUD_CONFIG_MX_MISSING_PRIORITY,
91
    SCLOUD_CONFIG_PRIORITY_ON_NON_MX,
92
    SCLOUD_CONFIG_INVALID_VIEW,
93
    SCLOUD_CONFIG_DUPLICATE_VIEW_NAME,
94
    SCLOUD_CONFIG_INVALID_DYNUPDATE,
95
    SCLOUD_CONFIG_DYNUPDATE_UNKNOWN_ZONE,
96
}
97
98
impl SCloudException {
99
    #[allow(unused)]
100
130
    pub(crate) fn to_str(&self) -> &'static str {
101
130
        match self {
102
            //HEADER SECTION
103
            SCloudException::SCLOUD_HEADER_DESERIALIZATION_FAILED => {
104
2
                "[HEADER_SECTION] Buffer length is less than header length."
105
            }
106
107
2
            SCloudException::SCLOUD_HEADER_BYTES_EMPTY => "[HEADER_SECTION] The header is empty.",
108
109
            // QUESTION SECTION
110
            SCloudException::SCLOUD_QUESTION_DESERIALIZATION_FAILED => {
111
2
                "[QUESTION_SECTION] Buffer length is less than question section length."
112
            }
113
            SCloudException::SCLOUD_QUESTION_SERIALIZATION_FAILED_QNAME_TOO_LONG => {
114
2
                "[QUESTION_SECTION] `q_name` too long."
115
            }
116
117
            // ANSWER SECTION
118
            SCloudException::SCLOUD_ANSWER_DESERIALIZATION_FAILED => {
119
2
                "[ANSWER_SECTION] Buffer length is less than answer section length."
120
            }
121
            SCloudException::SCLOUD_ANSWER_DESERIALIZATION_FAILED_LABEL_TOO_LONG => {
122
2
                "[ANSWER_SECTION] Label too long for DNS."
123
            }
124
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_ANSWER_HEADER_TOO_SHORT => {
125
2
                "[ANSWER_SECTION] Failed to parse DNS answer section: not enough bytes for TYPE, CLASS, TTL, and RDLENGTH."
126
            }
127
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_ANSWER_RDATA_OUT_OF_BOUNDS => {
128
2
                "[ANSWER_SECTION] Failed to parse DNS answer section: RDLENGTH exceeds remaining buffer size."
129
            }
130
131
            // AUTHORITY SECTION
132
            SCloudException::SCLOUD_AUTHORITY_DESERIALIZATION_FAILED_RDATA_OUT_OF_BOUNDS => {
133
2
                "[AUTHORITY_SECTION] Buffer length is less than authority section length."
134
            }
135
            SCloudException::SCLOUD_AUTHORITY_DESERIALIZATION_FAILED_BUF_TOO_SHORT => {
136
2
                "[AUTHORITY_SECTION] Impossible to deserialize, `buf.len()` is lower than `pos+10`. (buf too short)"
137
            }
138
139
            // ADDITIONAL SECTION
140
            SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED => {
141
2
                "[ADDITIONAL_SECTION] Buffer length is less than additional section length."
142
            }
143
            SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_BUF_TOO_SHORT => {
144
2
                "[ADDITIONAL_SECTION] Impossible to deserialize, `buf.len()` is lower than `pos+10`. (buf too short)"
145
            }
146
            SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_QNAME_TOO_LONG => {
147
2
                "[ADDITIONAL_SECTION] `q_name` too long."
148
            }
149
            SCloudException::SCLOUD_ADDITIONAL_DESERIALIZATION_FAILED_RDATA_OUT_OF_BOUNDS => {
150
2
                "[ADDITIONAL_SECTION] Buffer length is less than authority section length."
151
            }
152
153
            // QNAME
154
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME => {
155
2
                "[QNAME] Impossible to parse the `q_name`, check if a `q_name` is provided."
156
            }
157
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME_POS_GREATER_THAN_BUF => {
158
2
                "[QNAME] Impossible to parse the `q_name`, pos is greater than buffer length."
159
            }
160
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME_POS_AND_LEN_GREATER_THAN_BUF => {
161
2
                "[QNAME] Impossible to parse the `q_name`, pos and len are greater than buffer length."
162
            }
163
            SCloudException::SCLOUD_IMPOSSIBLE_PARSE_QNAME_COMPRESSION_FAILED => {
164
2
                "[QNAME] Impossible to parse the `q_name`, compression 0xC0xx failed."
165
            }
166
167
            // QTYPE
168
2
            SCloudException::SCLOUD_QTYPE_UNKNOWN_TYPE => "[QTYPE] Unknown `q_type`.",
169
170
            //QCLASS
171
            SCloudException::SCLOUD_QCLASS_U16_FOR_DNSCLASS_UNKNOWN => {
172
2
                "[QCLASS] Unknown `q_class`."
173
            }
174
            SCloudException::SCLOUD_QCLASS_DNSCLASS_FOR_U16_UNKNOWN => {
175
2
                "[QCLASS] Unknown `q_class`."
176
            }
177
178
            // STUB RESOLVER
179
            SCloudException::SCLOUD_STUB_RESOLVER_INVALID_DNS_ID => {
180
2
                "[STUB_RESOLVER] Invalid DNS ID (difference between `response.header.id` and `request_id`)."
181
            }
182
            SCloudException::SCLOUD_STUB_RESOLVER_INVALID_DNS_RESPONSE => {
183
2
                "[STUB_RESOLVER] Invalid DNS response."
184
            }
185
            SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_CREATE_SOCKET => {
186
2
                "[STUB_RESOLVER] Failed to create UDP socket."
187
            }
188
            SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_READ_SOCKET_TIMEOUT => {
189
2
                "[STUB_RESOLVER] Failed to read, socket timeout."
190
            }
191
            SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_SEND_TO_SOCKET => {
192
2
                "[STUB_RESOLVER] Failed to send to socket."
193
            }
194
            SCloudException::SCLOUD_STUB_RESOLVER_FAILED_TO_RECV_FROM_SOCKET => {
195
2
                "[STUB_RESOLVER] Failed to receive from socket."
196
            }
197
198
            // RESOLVER
199
            SCloudException::SCLOUD_RESOLVER_ANSWER_MISMATCH => {
200
2
                "[RESOLVER] DNS response failed validation against the original query."
201
            }
202
2
            SCloudException::SCLOUD_RESOLVER_RECORD_OUT_OF_ZONE => "[RESOLVER] Record out of zone.",
203
204
            // ZONES
205
            SCloudException::SCLOUD_ZONE_PARSER_FILE_NOT_FOUND => {
206
2
                "[ZONE_PARSER] Zone file not found."
207
            }
208
2
            SCloudException::SCLOUD_ZONE_PARSER_FILE_EMPTY => "[ZONE_PARSER] Zone file is empty.",
209
            SCloudException::SCLOUD_ZONE_PARSER_FAILED_TO_READ_ZONE_FILE => {
210
2
                "[ZONE_PARSER] `zone_parser()` failed to read the zone file."
211
            }
212
            SCloudException::SCLOUD_ZONE_PARSER_FAILED_TO_READ_TTL_FIELD => {
213
2
                "[ZONE_PARSER] `zone_parser()` detect TTL field but failed to read this field."
214
            }
215
216
            //CONFIG
217
            SCloudException::SCLOUD_CONFIG_FILE_NOT_FOUND => {
218
2
                "[SCLOUD_CONFIG] Configuration file not found."
219
            }
220
            SCloudException::SCLOUD_CONFIG_IMPOSSIBLE_TO_PARSE_JSON => {
221
2
                "[SCLOUD_CONFIG] Error while parsing the JSON file."
222
            }
223
            SCloudException::SCLOUD_CONFIG_MISSING_FORWARDER => {
224
2
                "[SCLOUD_CONFIG] Missing forwarder."
225
            }
226
2
            SCloudException::SCLOUD_CONFIG_MISSING_ADDRESS => "[SCLOUD_CONFIG] Missing address.",
227
            SCloudException::SCLOUD_CONFIG_IMPOSSIBLE_TO_PARSE_ADDR => {
228
2
                "[SCLOUD_CONFIG] Error while parsing the IP address."
229
            }
230
            SCloudException::SCLOUD_CONFIG_INVALID_SERVER_PORT => {
231
2
                "[SCLOUD_CONFIG] Invalid server port (must be between 1 and 65535)."
232
            }
233
234
            SCloudException::SCLOUD_CONFIG_INVALID_MAX_UDP_PAYLOAD => {
235
2
                "[SCLOUD_CONFIG] Invalid max UDP payload size."
236
            }
237
238
            SCloudException::SCLOUD_CONFIG_INVALID_DNS_LIMITS => {
239
2
                "[SCLOUD_CONFIG] Invalid DNS limits (label length, domain length, or packet size)."
240
            }
241
242
            SCloudException::SCLOUD_CONFIG_INVALID_LISTENER => {
243
2
                "[SCLOUD_CONFIG] Invalid listener configuration."
244
            }
245
246
            SCloudException::SCLOUD_CONFIG_DUPLICATE_LISTENER_NAME => {
247
2
                "[SCLOUD_CONFIG] Duplicate listener name detected."
248
            }
249
250
            SCloudException::SCLOUD_CONFIG_INVALID_LISTENER_PORT => {
251
2
                "[SCLOUD_CONFIG] Invalid listener port."
252
            }
253
254
            SCloudException::SCLOUD_CONFIG_INVALID_LISTENER_PROTOCOLS => {
255
2
                "[SCLOUD_CONFIG] Listener has no valid protocol defined."
256
            }
257
258
            SCloudException::SCLOUD_CONFIG_TLS_MISSING_CERT => {
259
2
                "[SCLOUD_CONFIG] TLS enabled but certificate path is missing."
260
            }
261
262
            SCloudException::SCLOUD_CONFIG_TLS_MISSING_KEY => {
263
2
                "[SCLOUD_CONFIG] TLS enabled but private key path is missing."
264
            }
265
266
            SCloudException::SCLOUD_CONFIG_TLS_REQUIRES_TCP => {
267
2
                "[SCLOUD_CONFIG] TLS listeners require TCP support."
268
            }
269
270
            SCloudException::SCLOUD_CONFIG_INVALID_DOH => {
271
2
                "[SCLOUD_CONFIG] Invalid DNS-over-HTTPS (DoH) configuration."
272
            }
273
274
            SCloudException::SCLOUD_CONFIG_UNKNOWN_ACL_REFERENCE => {
275
2
                "[SCLOUD_CONFIG] Unknown or invalid ACL reference."
276
            }
277
278
            SCloudException::SCLOUD_CONFIG_INVALID_FORWARDER => {
279
2
                "[SCLOUD_CONFIG] Invalid forwarder configuration."
280
            }
281
282
            SCloudException::SCLOUD_CONFIG_DUPLICATE_FORWARDER_NAME => {
283
2
                "[SCLOUD_CONFIG] Duplicate forwarder name detected."
284
            }
285
286
            SCloudException::SCLOUD_CONFIG_INVALID_ZONE => {
287
2
                "[SCLOUD_CONFIG] Invalid DNS zone configuration."
288
            }
289
290
            SCloudException::SCLOUD_CONFIG_DUPLICATE_ZONE_NAME => {
291
2
                "[SCLOUD_CONFIG] Duplicate zone name detected."
292
            }
293
294
            SCloudException::SCLOUD_CONFIG_ZONE_MISSING_FILE => {
295
2
                "[SCLOUD_CONFIG] Zone file path is missing."
296
            }
297
298
            SCloudException::SCLOUD_CONFIG_SLAVE_MISSING_MASTERS => {
299
2
                "[SCLOUD_CONFIG] Slave zone has no master servers defined."
300
            }
301
302
            SCloudException::SCLOUD_CONFIG_FORWARD_ZONE_MISSING_FORWARDERS => {
303
2
                "[SCLOUD_CONFIG] Forward zone has no forwarders defined."
304
            }
305
306
            SCloudException::SCLOUD_CONFIG_INVALID_INLINE_ZONE => {
307
2
                "[SCLOUD_CONFIG] Inline zone is invalid (missing records or SOA)."
308
            }
309
310
            SCloudException::SCLOUD_CONFIG_UNKNOWN_TSIG_KEY => {
311
2
                "[SCLOUD_CONFIG] Referenced TSIG key does not exist."
312
            }
313
314
            SCloudException::SCLOUD_CONFIG_MX_MISSING_PRIORITY => {
315
2
                "[SCLOUD_CONFIG] MX record is missing priority field."
316
            }
317
318
            SCloudException::SCLOUD_CONFIG_PRIORITY_ON_NON_MX => {
319
2
                "[SCLOUD_CONFIG] Priority field is only allowed on MX records."
320
            }
321
322
            SCloudException::SCLOUD_CONFIG_INVALID_VIEW => {
323
2
                "[SCLOUD_CONFIG] Invalid DNS view configuration."
324
            }
325
326
            SCloudException::SCLOUD_CONFIG_DUPLICATE_VIEW_NAME => {
327
2
                "[SCLOUD_CONFIG] Duplicate view name detected."
328
            }
329
330
            SCloudException::SCLOUD_CONFIG_INVALID_DYNUPDATE => {
331
2
                "[SCLOUD_CONFIG] Invalid dynamic update configuration."
332
            }
333
334
            SCloudException::SCLOUD_CONFIG_DYNUPDATE_UNKNOWN_ZONE => {
335
2
                "[SCLOUD_CONFIG] Dynamic update references an unknown zone."
336
            }
337
0
            _ => "[SCLOUD] Unknown error.",
338
        }
339
130
    }
340
}